home *** CD-ROM | disk | FTP | other *** search
/ The World's Largest Collection of Windows Software / The World's Largest Collection of Windows Software - Disc 2.iso / win / pro207 / setup.ms_ / setup.bin
Text File  |  1993-03-14  |  21KB  |  725 lines

  1. '**************************************************************************
  2. '*                       FoxPro/Windows Installation
  3. '**************************************************************************
  4.  
  5. '$INCLUDE 'setup.inc'
  6.  
  7. DECLARE FUNCTION GetProgMgrGrps LIB "mscuistf.dll" AS INTEGER
  8. DECLARE FUNCTION QuietConfigUpdate LIB "mscuistf.dll" AS INTEGER
  9. DECLARE FUNCTION CanFindConfigSys LIB "mscuistf.dll" AS INTEGER
  10. DECLARE FUNCTION CalcListSize LIB "mscuistf.dll" AS LONG
  11. DECLARE FUNCTION WindowWidth LIB "mscuistf.dll" (iWind%) AS INTEGER
  12. DECLARE FUNCTION WindowHeight LIB "mscuistf.dll" (iWind%) AS INTEGER
  13. DECLARE FUNCTION InsertFile LIB "mscuistf.dll" (szDestFile$, szSourceFile$) AS INTEGER
  14. DECLARE FUNCTION Spawn LIB "mscuistf.dll" (szCommand$, szDir$) AS INTEGER
  15.  
  16. ''Local functions and procedures.
  17. DECLARE SUB AddToPM
  18. DECLARE SUB ConfirmQuit
  19. DECLARE SUB CreateCopyList
  20. DECLARE SUB DoRestart
  21. DECLARE SUB Install
  22. DECLARE SUB GetPathInfo
  23. DECLARE SUB GetPathGrpInfo
  24. DECLARE SUB GetUserDefaults
  25. DECLARE SUB UpdateConfig
  26. DECLARE SUB UpdateINI
  27.  
  28. DECLARE FUNCTION ConfirmNameOrg () AS STRING
  29. DECLARE FUNCTION EnoughSpace () AS STRING
  30. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  31. DECLARE FUNCTION SectionSize (szSection$) AS INTEGER
  32. DECLARE FUNCTION WarnBadPath () AS STRING
  33.  
  34. ''Dialog ID's
  35. CONST ASKQUIT           = 200           ''Is the user certain they want to quit?
  36. CONST BADINI            = 4500            ''We couldn't read setup.ini.
  37. CONST BADMODE           = 2100          ''We aren't in Enhanced mode.
  38. CONST BADNAME           = 7700          ''The user has to enter a name.
  39. CONST BADPATH           = 6400          ''The target directory can't be written to.
  40. CONST BADPATH_FORCED    = 6200            ''The target directory is bad, but the user can't change it.
  41. CONST BILLBOARD         = 20000         ''Used to hold billboard bitmaps.
  42. CONST CANTADDRSC        = 4700            ''Can't add resource to foxprow.exe
  43. CONST CANTFIND          = 3900          ''Can't find config.sys.
  44. CONST CANTQUIT          = 2300          ''Couldn't exit Windows.
  45. CONST CANTSPAWN            = 6500            ''Couldn't run optional stuff.
  46. CONST CANTUPDATE        = 3500          ''Coulsn't update config.sys.
  47. CONST CANTWRITETOFP        = 5200            ''FoxPro is in a read only directory.
  48. CONST CONFIRMINFO       = 7300          ''Is the name and organization ok?
  49. CONST DESTPATH          = 5300            ''Get target directory without a group.
  50. CONST DESTPATHGROUP     = 5400          ''Get target directory and group.
  51. CONST DISKFULL          = 5500          ''Not enough disk space is available.
  52. CONST DISKFULL_BACK        = 6100            ''Not enough disk space is available, change path?
  53. CONST DISKWINFULL       = 5600          ''Not enough space on Windows drive.
  54. CONST EDITCONFIG        = 2700          ''Review changes to config.sys
  55. CONST EDITMODE          = 3800          ''Select method of updating config.sys
  56. CONST EDITOK            = 3700          ''We updated config.sys
  57. CONST EXITFAILURE       = 5700            ''We are quiting due to an error.
  58. CONST EXITNOICON        = 2800          ''We installed, but don't have an icon.
  59. CONST EXITQUIT          = 5800            ''We were forced to quit by the user.
  60. CONST EXITSUCCESS       = 5900            ''We have successfully finished.
  61. CONST GETNAMEORG        = 1300          ''Get the user's name and organization.
  62. CONST NOPROD            = 5100            ''Path to foxprow.exe is bad.
  63. CONST NOT386            = 1800          ''Machine is less than a 386SX.
  64. CONST OPTIONS            = 800            ''Components to install.
  65. CONST REINSTALL         = 2000          ''Copy disincentive message.
  66. CONST RESTARTWIN        = 2200          ''Warn before restarting windows.
  67. CONST WAITADDRSC        = 4900            ''Wait while adding FOXT.EXE.
  68. CONST WAITINI           = 6600          ''Wait while updating INI files.
  69. CONST WAITSPACE         = 6700          ''Wait while getting free disk space.
  70.  
  71. CONST MSGRAPH            = 1
  72. CONST APPLICATION        = 2
  73. CONST SYSFILES            = 3
  74.  
  75. CONST CUIDLL$           = "mscuistf.dll"                ''The .DLL containing our dialog routines.
  76. CONST DEFAULT_TITLE$    = "Setup"
  77. CONST LOGO              = 2                             ''Logo Bitmap ID.
  78. CONST LASTRESORT$       = "Setup was damaged.  Please try a new set of disks."
  79. CONST LASTTITLE$        = "Setup Error"
  80. CONST MINFILES%         = 40
  81. CONST NO                = 0
  82. CONST NOGROUP$          = "- NONE -"                    ''Group name which means don't create a group.
  83. CONST README$            = "README.TXT"
  84. CONST READ_DESC$        = "Read Me"
  85. CONST YES                = 1
  86.  
  87. GLOBAL DEST$            ''Default destination directory.
  88. GLOBAL fGRAPH%            ''Flag indicating if the graph runtime is to be installed.
  89. GLOBAL fWIN31%          ''Flag indicating if we are running under 3.1 or later.
  90. GLOBAL GROUP$           ''Default destination group.
  91. GLOBAL MODE$            ''Determines whether we let the user change path and/or group.
  92. GLOBAL MSDEST$            ''MS Graph runtime location.
  93. GLOBAL PM_EXE$            ''Exe to add to the PM.
  94. GLOBAL PM_DESCRIPT$        ''Label for the PM.
  95. GLOBAL QUIT_PROG$        ''Program to execute when we quit.
  96. GLOBAL SRCDIR$          ''Location of install files.
  97. GLOBAL szInf$            ''Location of the inf file.
  98. GLOBAL WINDIR$            ''Windows directory.
  99. GLOBAL WINSYSDIR$       ''Windows system directory.
  100.  
  101. INIT:
  102.     ON ERROR GOTO QUIT
  103.  
  104.     DEST$           = "c:\foxprow"
  105.     DLG%            = 400
  106.     fGRAPH%            = NO
  107.     GROUP$            = "FoxPro for Windows"
  108.     MODE$            = "NO"
  109.     MSDEST$         = MakePath(GetWindowsDir(), "msapps")
  110.     PMGROUPS%       = 0
  111.     QUIT_PROG$        = ""
  112.     SRCDIR$         = GetSymbolValue("STF_SRCDIR")
  113.     WINDIR$            = GetWindowsDir()
  114.     WINSYSDIR$        = GetWindowsSysDir()
  115.  
  116.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  117.     IF szInf$ = "" THEN
  118.         szInf$ = GetSymbolValue("STF_CWDDIR") + "SETUP.INF"
  119.     END IF
  120.     ReadInfFile szInf$
  121.  
  122.     fGRAPH%    = DoesIniSectionExist(szInf$, "MSGraph")
  123.     SetSymbolValue "NoGroup", NOGROUP$
  124.  
  125. ''    SetBitmap CUIDLL$, LOGO
  126.  
  127. ''
  128. '' Make sure we have at least a 386SX.
  129. ''
  130. IF GetProcessorType() < 3 THEN
  131.     PROCESSOR:
  132.     sz$ = UIStartDlg(CUIDLL$, NOT386, "FInfo0DlgProc", 0, "")
  133.     IF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
  134.         ConfirmQuit
  135.         GOTO PROCESSOR
  136.     END IF
  137.     UIPop 1
  138.     END
  139. END IF
  140.  
  141. ''
  142. '' Warn the user if we are not in Enhanced mode.
  143. ''
  144. IF GetWindowsMode() < 2 THEN
  145.     ENHANCED:
  146.         sz$ = UIStartDlg(CUIDLL$, BADMODE, "FInfoDlgProc", 0, "")
  147.         IF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
  148.             ConfirmQuit
  149.             GOTO ENHANCED
  150.         ELSE
  151.             UIPop 1
  152.         END IF
  153. END IF
  154.  
  155. ''
  156. '' Get the user's choices for window titles, default directories, etc.
  157. ''
  158. GetUserDefaults
  159.  
  160. ''
  161. '' For our own use, see if we are running on a version later than 3.0.
  162. ''
  163. fWIN31% = YES
  164. IF GetWindowsMajorVersion() < 3 THEN
  165.     fWIN31% = NO
  166. ELSEIF GetWindowsMajorVersion() = 3 AND GetWindowsMinorVersion() = 0 THEN
  167.     fWIN31% = NO
  168. END IF
  169.  
  170. ''
  171. '' Get a list of PM groups if possible.
  172. ''
  173. IF fWIN31% = YES THEN
  174.     PMGROUPS% = GetProgMgrGrps()
  175. END IF
  176.  
  177. ''
  178. '' Have the user specify where to put the product.  (Including the group if
  179. '' we can get the info.)
  180. ''
  181. GETTARGETINFO:
  182.     IF MODE$ <> "YES" THEN
  183.         IF fWIN31% = NO OR GetListLength("ListItemsIn") = 0 OR MODE$ = "GROUP ONLY" THEN
  184.             GetPathInfo
  185.         ELSE
  186.             GetPathGrpInfo
  187.         END IF
  188.     ELSE
  189.         IF IsDirWritable(DEST$) = NO THEN
  190.             sz$ = UIStartDlg(CUIDLL$, BADPATH_FORCED, "FInfoDlgProc", 0, "")
  191.             ERROR STFERR
  192.         END IF
  193.     END IF
  194.  
  195. IF EnoughSpace() = "BACK" THEN
  196.     GOTO GETTARGETINFO
  197. END IF
  198.  
  199. ''
  200. '' Try to gaurantee that FILES are at least a minimum value.
  201. ''
  202. UpdateConfig
  203.  
  204. Install
  205.  
  206. IF ERR = STFQUIT THEN
  207.     DLG% = EXITQUIT
  208. ELSE
  209.     DLG% = EXITSUCCESS
  210. END IF
  211. GOTO QUITL1
  212.  
  213. QUIT:
  214.     UIPopAll
  215.     IF ERR = STFPROGMAN THEN
  216.         DLG% = EXITNOICON
  217.     ELSEIF ERR = STFQUIT THEN
  218.         DLG% = EXITQUIT
  219.     ELSE
  220.         DLG% = EXITFAILURE
  221.     END IF
  222.  
  223. QUITL1:
  224.     ON ERROR GOTO TOAST
  225.  
  226.     IF DLG% = EXITSUCCESS AND LEN(QUIT_PROG$) <> 0 THEN
  227.         QUIT_PROG$ = MakePath(DEST$, QUIT_PROG$)
  228.         IF (MID$(DEST$, LEN(DEST$), 1) = "\") THEN
  229.             y$ = MID$(DEST$, 1, LEN(DEST$)-1)
  230.         ELSE
  231.             y$ = DEST$
  232.         END IF
  233.         x% = Spawn(QUIT_PROG$, y$)
  234.         IF x% <> 0 THEN
  235.             SetSymbolValue "EXE_NAME", QUIT_PROG$
  236.             sz$ = UIStartDlg(CUIDLL$, DLG%, "FVarStringDlgProc", 0, "")
  237.             UIPop 1
  238.             DLG% = EXITFAILURE
  239.         ELSE
  240.             UIPop ALL
  241.             END
  242.         END IF
  243.     END IF
  244.  
  245. QUITL2:
  246.     IF DLG% <> EXITSUCCESS OR LEN(QUIT_PROG$) = 0 THEN
  247.         sz$ = UIStartDlg(CUIDLL$, DLG%, "FInfoDlgProc", 0, "")
  248.         IF sz$ = "REACTIVATE" THEN
  249.             GOTO QUITL2
  250.         END IF
  251.         UIPop ALL
  252.     END IF
  253.  
  254.     END
  255.  
  256. TOAST:
  257.     UIPopAll
  258.     x% = DoMsgBox(LASTRESORT$, LASTTITLE$, MB_OK+MB_TASKMODAL+MB_ICONHAND)
  259.     END
  260.  
  261. '**
  262. '** Purpose:
  263. '**     Copies the files in the copy list and adds FoxPro to the target
  264. '**             group if one was psecified.
  265. '** Arguments:
  266. '**     none.
  267. '** Returns:
  268. '**     none.
  269. '*************************************************************************
  270. SUB Install STATIC
  271.  
  272.     ''
  273.     '' Do the copy
  274.     ''
  275.     CreateCopyList
  276.     SetRestartDir GetSymbolValue("STF_CWDDIR")
  277.     CopyFilesInCopyList
  278.  
  279.     AddToPM
  280.     UpdateINI
  281.  
  282.     IF RestartListEmpty() = 0 THEN
  283.         DoRestart
  284.     END IF
  285.  
  286. END SUB
  287.  
  288. '**
  289. '** Purpose:
  290. '**     Creates the PM group and items(s).
  291. '** Arguments:
  292. '**     none.
  293. '** Returns:
  294. '**     none.
  295. '*************************************************************************
  296. SUB AddToPM STATIC
  297.     IF GROUP$ <> NOGROUP$ AND LEN(PM_EXE$) <> 0 THEN
  298.         CreateProgmanGroup GROUP$, "", cmoNone
  299.  
  300.         IF LEN(PM_EXE$) > 0 THEN
  301.             y$ = MakePath(DEST$, PM_EXE$)
  302.             IF fWIN31% = YES THEN
  303.                 CreateProgmanItem GROUP$, PM_DESCRIPT$, y$, y$+",0,0,0,"+DEST$, cmoOverwrite
  304.             ELSE
  305.                 CreateProgmanItem GROUP$, PM_DESCRIPT$, y$, "", cmoOverwrite
  306.             END IF
  307.         END IF
  308.  
  309.         y$ = MakePath(DEST$, README$)
  310.         IF DoesFileExist(y$, femExists) = YES THEN
  311.             CreateProgmanItem GROUP$, READ_DESC$, y$, "", cmoOverwrite
  312.         END IF
  313.  
  314.         ShowProgmanGroup GROUP$, 1, cmoNone
  315.     END IF
  316. END SUB
  317.  
  318. '**
  319. '** Purpose:
  320. '**     Exits to DOS to update Window's system files which were in use.
  321. '** Arguments:
  322. '**     none.
  323. '** Returns:
  324. '**     none.
  325. '*************************************************************************
  326. SUB DoRestart STATIC
  327.     RESTARTBEGIN:
  328.         sz$ = UIStartDlg(CUIDLL$, RESTARTWIN, "FInfoDlgProc", 0, "")
  329.         IF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
  330.             ConfirmQuit
  331.             GOTO RESTARTBEGIN
  332.         END IF
  333.         UIPop 1
  334.  
  335.         TRYTOQUIT:
  336.         IF ExitExecRestart() = 0 THEN
  337.             TRYTOQUITL2:
  338.             sz$ = UIStartDlg(CUIDLL$, CANTQUIT, "FInfoDlgProc", 0, "")
  339.             IF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
  340.                 ConfirmQuit
  341.                 GOTO TRYTOQUITL2
  342.             END IF
  343.             GOTO TRYTOQUIT
  344.         END IF
  345. END SUB
  346.  
  347. '**
  348. '** Purpose:
  349. '**     Updates any INI files that need it and does any other misc. updates.
  350. '** Arguments:
  351. '**     none.
  352. '** Returns:
  353. '**     none.
  354. '*************************************************************************
  355. SUB UpdateINI STATIC
  356.     IF fGRAPH% = YES THEN
  357.         oldCursor% = ShowWaitCursor()
  358.         sz$ = UIStartDlg(CUIDLL$, WAITINI, "FNoWaitDlgProc", 0, "")
  359.  
  360.         CreateIniKeyValue "WIN.INI", "MSAPPS", "msapps", MSDEST$, cmoOverwrite
  361.  
  362.         CreateRegKeyValue "MSGraph", "MS Graph Developer Edition"
  363.         CreateRegKeyValue ".gra", "MSGraph"
  364.         CreateRegKeyValue "MSGraph\protocol\StdFileEditing\server", MakePath(MSDEST$,"msgraph\graph.exe")
  365.         CreateRegKeyValue "MSGraph\protocol\StdFileEditing\SetDataFormats", "Native,CF_TEXT"
  366.         CreateRegKeyValue "MSGraph\protocol\StdFileEditing\RequestDataFormats", "Native,CF_METAFILEPICT"
  367.         CreateRegKeyValue "MSGraph\protocol\StdExecute\server", MakePath(MSDEST$,"msgraph\graph.exe")
  368.  
  369.         UIPop 1
  370.         RestoreCursor oldCursor%
  371.     END IF
  372. END SUB
  373.  
  374. '**
  375. '** Purpose:
  376. '**     Gets the path where the user wishes to install FoxPro.
  377. '** Arguments:
  378. '**     none.
  379. '** Returns:
  380. '**     none.
  381. '*************************************************************************
  382. SUB GetPathInfo STATIC
  383.  
  384.     SetSymbolValue "EditTextIn", LCASE$(DEST$)
  385.  
  386.     GETPATHINFOSTART:
  387.         sz$ = UIStartDlg(CUIDLL$, DESTPATH, "FEditDlgProc", 0, "")
  388.         DEST$ = GetSymbolValue("EditTextOut")
  389.  
  390.         IF sz$ = "CONTINUE" THEN
  391.             IF LEN(DEST$) > 0 THEN
  392.                 IF MID$(DEST$, LEN(DEST$), 1) = ":" THEN
  393.                     DEST$ = DEST$ + "\"
  394.                 END IF
  395.             END IF
  396.             IF IsDirWritable(DEST$) = NO THEN
  397.                 x$ = WarnBadPath()
  398.                 GOTO GETPATHINFOSTART
  399.             END IF
  400.         ELSEIF sz$ = "REACTIVATE" THEN
  401.             GOTO GETPATHINFOSTART
  402.         ELSE
  403.             ConfirmQuit
  404.             GOTO GETPATHINFOSTART
  405.         END IF
  406.  
  407.         UIPop 1
  408.  
  409.         RemoveSymbol "EditTextIn"
  410.         RemoveSymbol "EditTextOut"
  411. END SUB
  412.  
  413. '**
  414. '** Purpose:
  415. '**     Gets the path and PM group where the user wishes to install FoxPro.
  416. '** Arguments:
  417. '**     none.
  418. '** Returns:
  419. '**     none.
  420. '*************************************************************************
  421. SUB GetPathGrpInfo () STATIC
  422.  
  423.     SetSymbolValue "EditTextIn", DEST$
  424.     SetSymbolValue "ListDefault", GROUP$
  425.  
  426.     GETPATHGRPINFOSTART:
  427.         sz$ = UIStartDlg(CUIDLL$, DESTPATHGROUP, "FDirGrpProc", 0, "")
  428.         DEST$   = GetSymbolValue("EditTextOut")
  429.         GROUP$  = GetSymbolValue("ListItemsOut")
  430.  
  431.         IF sz$ = "CONTINUE" THEN
  432.             IF LEN(DEST$) > 0 THEN
  433.                 IF MID$(DEST$, LEN(DEST$), 1) = ":" THEN
  434.                     DEST$ = DEST$ + "\"
  435.                 END IF
  436.             END IF
  437.             IF IsDirWritable(DEST$) = NO THEN
  438.                 x$ = WarnBadPath()
  439.                 GOTO GETPATHGRPINFOSTART
  440.             END IF
  441.         ELSEIF sz$ = "REACTIVATE" THEN
  442.             GOTO GETPATHGRPINFOSTART
  443.         ELSE
  444.             ConfirmQuit
  445.             GOTO GETPATHGRPINFOSTART
  446.         END IF
  447.  
  448.         UIPop 1
  449.  
  450.         RemoveSymbol "EditTextIn"
  451.         RemoveSymbol "EditTextOut"
  452.         RemoveSymbol "ListDefault"
  453.         RemoveSymbol "ListItemsOut"
  454. END SUB
  455.  
  456. '**
  457. '** Purpose:
  458. '**     Determines if we have enough space to do the install.
  459. '** Arguments:
  460. '**     none.
  461. '** Returns:
  462. '**     "CONTINUE" or "BACK".
  463. '*************************************************************************
  464. FUNCTION EnoughSpace() STATIC AS STRING
  465.     oldCursor% = ShowWaitCursor()
  466.     sz$ = UIStartDlg(CUIDLL$, WAITSPACE, "FNoWaitDlgProc", 0, "")
  467.  
  468.     EnoughSpace = "CONTINUE"
  469.  
  470.     SpaceAvail& = GetFreeSpaceForDrive(MID$(DEST$, 1, 1)) / 1024
  471.     WinSpaceAvail& = GetFreeSpaceForDrive(MID$(WINSYSDIR$, 1, 1)) / 1024
  472.  
  473.     SpaceNeed& = SectionSize("Application")
  474.     WinSpaceNeed& = SectionSize("Sysfiles")
  475.     IF fGRAPH% = YES THEN
  476.         WinSpaceNeed& = WinSpaceNeed& + SectionSize("MSGraph")
  477.     END IF
  478.  
  479.     RestoreCursor oldCursor%
  480.     UIPop 1
  481.  
  482.     ''
  483.     '' If Windows is on the drive we are installing to, combine
  484.     '' the needed values.
  485.     ''
  486.     IF MID$(DEST$, 1, 1) = MID$(WINSYSDIR$, 1, 1) THEN
  487.         SpaceNeed& = SpaceNeed& + WinSpaceNeed&
  488.     END IF
  489.  
  490.     ''
  491.     '' Check to see if we have room
  492.     ''
  493.     IF SpaceNeed& > SpaceAvail& THEN
  494.         IF MODE$ <> "YES" THEN
  495.             dialogs% = DISKFULL_BACK
  496.         ELSE
  497.             dialog% = DISKFULL
  498.         END IF
  499.     ELSEIF SpaceNeedWin& > SpaceAvailWin& THEN
  500.         dialog% = DISKWINFULL
  501.     ELSE
  502.         dialog% = 0
  503.     END IF
  504.  
  505.     IF dialog% > 0 THEN
  506.         NOROOM:
  507.             sz$ = UIStartDlg(CUIDLL$, dialog%, "FInfoDlgProc", 0, "")
  508.             UIPop 1
  509.             IF sz$ = "BACK" THEN
  510.                 EnoughSpace = "BACK"
  511.             ELSEIF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
  512.                 ConfirmQuit
  513.                 GOTO NOROOM
  514.             END IF
  515.     END IF
  516.  
  517. END FUNCTION
  518.  
  519. '**
  520. '** Purpose:
  521. '**     Update FILES in config.sys if needed.
  522. '** Arguments:
  523. '**     none.
  524. '** Returns:
  525. '**     none.
  526. '*************************************************************************
  527. SUB UpdateConfig STATIC
  528.     IF CanFindConfigSys() <> 0 THEN
  529.         IF GetConfigNumFiles() < MINFILES% THEN
  530.             SetSymbolValue "RadioDefault", "1"
  531.             UPDATETYPE:
  532.                 sz$ = UIStartDlg(CUIDLL$, EDITMODE, "FRadioDlgProc", 0, "")
  533.                 IF sz$ = "CONTINUE" THEN
  534.                     UIPop 1
  535.  
  536.                     SetSymbolValue "MIN_FILES", "40"
  537.  
  538.                     IF GetSymbolValue("ButtonChecked") = "1" THEN
  539.                         x% = QuietConfigUpdate()
  540.                     ELSEIF GetSymbolValue("ButtonChecked") = "2" THEN
  541.                         EDITCONFIGSTART:
  542.                             sz$ = UIStartDlg(CUIDLL$, EDITCONFIG, "ConfigEditDlg", 0, "")
  543.                             IF sz$ = "EXIT" or sz$ = "CANCEL" THEN
  544.                                 ConfirmQuit
  545.                                 GOTO EDITCONFIGSTART
  546.                             ENDIF
  547.                             UIPop 1
  548.                     ELSE
  549.                         GOTO CONFIGEND
  550.                     ENDIF
  551.  
  552.                     IF GetSymbolValue("UPDATE_RESULT") = "ERROR" THEN
  553.                         sz$ = UIStartDlg(CUIDLL$, CANTUPDATE, "FInfo0DlgProc", 0, "")
  554.                     ELSE
  555.                         sz$ = UIStartDlg(CUIDLL$, EDITOK, "FDlgFNameProc", 0, "")
  556.                     END IF
  557.                     UIPop 1
  558.  
  559.                 ELSE
  560.                     ConfirmQuit
  561.                     SetSymbolValue "RadioDefault", GetSymbolValue("ButtonChecked")
  562.                     GOTO UPDATETYPE
  563.                 END IF
  564.         END IF
  565.         CONFIGEND:
  566.     ELSE
  567.         SetSymbolValue "ConfirmTextIn", ""
  568.         AddListItem "ConfirmTextIn", STR$(MINFILES%)
  569.         AddListItem "ConfirmTextIn", STR$(MINFILES%)
  570.         sz$ = UIStartDlg(CUIDLL$, CANTFIND, "FSprintfDlgProc", 0, "")
  571.         UIPop 1
  572.     END IF
  573. END SUB
  574.  
  575. '**
  576. '** Purpose:
  577. '**     Confirms that the user really wants to quit when they select a quit
  578. '**             option.
  579. '** Arguments:
  580. '**     none.
  581. '** Returns:
  582. '**     none.
  583. '*************************************************************************
  584. SUB ConfirmQuit STATIC
  585.     CONFIRMQUITSTART:
  586.     cq$ = UIStartDlg(CUIDLL$, ASKQUIT, "FInfoDlgProc", 0, "")
  587.  
  588.     IF cq$ = "EXIT" or cq$ = "CANCEL" THEN
  589.         UIPopAll
  590.         ERROR STFQUIT
  591.     ELSEIF cq$ = "REACTIVATE" THEN
  592.         GOTO CONFIRMQUITSTART
  593.     ELSE
  594.         UIPop 1
  595.     END IF
  596. END SUB
  597.  
  598. '**
  599. '** Purpose:
  600. '**     Warns the user that they have specified an invalid path.
  601. '** Arguments:
  602. '**     none.
  603. '** Returns:
  604. '**     none.
  605. '*************************************************************************
  606. FUNCTION WarnBadPath () STATIC AS STRING
  607.     WARNBADPATHSTART:
  608.     sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfoDlgProc", 0, "")
  609.     IF sz$ = "REACTIVATE" THEN
  610.         GOTO WARNBADPATHSTART
  611.     ELSEIF sz$ = "CANCEL" OR sz$ = "EXIT" THEN
  612.         ConfirmQuit
  613.         GOTO WARNBADPATHSTART
  614.     END IF
  615.     UIPop 1
  616.  
  617.     WarnBadPath = sz$
  618. END FUNCTION
  619.  
  620. '**
  621. '** Purpose:
  622. '**     Appends a file name to the end of a directory path,
  623. '**     inserting a backslash character as needed.
  624. '** Arguments:
  625. '**     szDir$  - full directory path (with optional ending "\")
  626. '**     szFile$ - filename to append to directory
  627. '** Returns:
  628. '**     Resulting fully qualified path name.
  629. '*************************************************************************
  630. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  631.     IF szDir$ = "" THEN
  632.         MakePath = szFile$
  633.     ELSEIF szFile$ = "" THEN
  634.         MakePath = szDir$
  635.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  636.         MakePath = szDir$ + szFile$
  637.     ELSE
  638.         MakePath = szDir$ + "\" + szFile$
  639.     END IF
  640. END FUNCTION
  641.  
  642. '**
  643. '** Purpose:
  644. '**     Sets the global copy list to install a the options selected by
  645. '**             the user as indicated by the list CheckItems.
  646. '** Arguments:
  647. '**     none.
  648. '** Returns:
  649. '**     none.
  650. '*************************************************************************
  651. SUB CreateCopyList () STATIC
  652.  
  653.     ClearCopyList
  654.  
  655.     AddSectionFilesToCopyList "Application", SRCDIR$, DEST$
  656.     AddSectionFilesToCopyList "Sysfiles", SRCDIR$, WINSYSDIR$
  657.     IF fGRAPH% = YES THEN
  658.         AddSectionFilesToCopyList "MSGraph", SRCDIR$, MakePath(MSDEST$,"msgraph")
  659.     END IF
  660. END SUB
  661.  
  662. '**
  663. '** Purpose:
  664. '**     Determines how much space a given section will occupy.
  665. '** Arguments:
  666. '**     szSection$ - The section to determine the size of.
  667. '** Returns:
  668. '**     The size in K bytes of the section.
  669. '*************************************************************************
  670. FUNCTION SectionSize (szSection$) STATIC AS INTEGER
  671.     MakeListFromSectionSize "SizeList", szSection$
  672.     SectionSize = CalcListSize()
  673.     RemoveSymbol "SizeList"
  674. END FUNCTION
  675.  
  676. '**
  677. '** Purpose:
  678. '**     Reads the INF file to get the user's preferences for various
  679. '**        settings.
  680. '** Arguments:
  681. '**     (NONE)
  682. '** Returns:
  683. '**     (NONE)
  684. '*************************************************************************
  685. SUB GetUserDefaults STATIC
  686.     '' Get the default window title
  687.     y$ = GetIniKeyString(szInf$, "FP SETUP", "TITLE")
  688.     z$ = GetIniKeyString(szInf$, "FP SETUP", "COPYRIGHT")
  689.     IF LEN(y$) <> 0 THEN
  690.         SetSymbolValue "DLG_TITLE", y$
  691.         SetTitle y$
  692.         IF LEN(z$) <> 0 THEN
  693.             SetAbout y$, z$
  694.         END IF
  695.     ELSE
  696.         SetSymbolValue "DLG_TITLE", DEFAULT_TITLE$
  697.     END IF
  698.  
  699.     '' Get the default installation directory
  700.     y$ = GetIniKeyString(szInf$, "FP SETUP", "PATH")
  701.     IF LEN(y$) <> 0 THEN
  702.         DEST$ = y$
  703.     END IF
  704.  
  705.     '' Get the default installation group
  706.     y$ = GetIniKeyString(szInf$, "FP SETUP", "GROUP")
  707.     IF LEN(y$) <> 0 THEN
  708.         GROUP$ = y$
  709.     END IF
  710.     SetSymbolValue "FoxProGroup", GROUP$
  711.  
  712.     '' Get the information used when adding stuff to the Program Manager
  713.     PM_EXE$ = GetIniKeyString(szInf$, "FP SETUP", "PROGRAM")
  714.     PM_DESCRIPT$ = GetIniKeyString(szInf$, "FP SETUP", "DESCRIPT")
  715.  
  716.     '' Get the user's control level
  717.     y$ = GetIniKeyString(szInf$, "FP SETUP", "FORCELOC")
  718.     IF LEN(y$) <> 0 THEN
  719.         MODE$ = y$
  720.     END IF
  721.  
  722.     '' Get the program to execute when we quit
  723.     QUIT_PROG$ = GetIniKeyString(szInf$, "FP SETUP", "RUN")
  724. END SUB
  725.